#include "ImageSaver.h"
#include <QImageWriter>
#include <QFileInfo>
#include <QFile>
#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>
#include <QMap>
#include <QDir>
#include <QJsonArray>
#include "ImageSaver.h"

/**
 * @brief 构造函数，初始化错误信息和默认保存路径/格式
 */
ImageSaver::ImageSaver() : FileHandler() {
    // 设置默认保存路径为软件运行目录下的"相机图像"文件夹
    QString appDir = QCoreApplication::applicationDirPath();
    m_defaultSavePath = appDir + "/相机图像";
    
    // 设置默认保存格式为tif
    m_defaultSaveFormat = "tif";
    
    // 确保默认保存路径存在
    QDir dir(m_defaultSavePath);
    if (!dir.exists()) {
        dir.mkpath(m_defaultSavePath);
    }
}

/**
 * @brief 设置默认保存路径
 * @param path 默认保存路径
 */
void ImageSaver::setDefaultSavePath(const QString &path) {
    m_defaultSavePath = path;
    
    // 确保路径存在
    QDir dir(m_defaultSavePath);
    if (!dir.exists()) {
        dir.mkpath(m_defaultSavePath);
    }
}

/**
 * @brief 获取默认保存路径
 * @return 默认保存路径
 */
QString ImageSaver::getDefaultSavePath() const {
    return m_defaultSavePath;
}

/**
 * @brief 设置默认保存格式
 * @param format 默认保存格式（如"tif"、"png"等）
 */
void ImageSaver::setDefaultSaveFormat(const QString &format) {
    m_defaultSaveFormat = format;
}

/**
 * @brief 获取默认保存格式
 * @return 默认保存格式
 */
QString ImageSaver::getDefaultSaveFormat() const {
    return m_defaultSaveFormat;
}

/**
 * @brief 生成默认文件名
 * @param imageGuid 图像GUID
 * @return 生成的默认文件名（包含路径）
 */
QString ImageSaver::generateDefaultFileName(const QString &imageGuid) {
    // 确保默认保存路径存在
    QDir dir(m_defaultSavePath);
    if (!dir.exists()) {
        dir.mkpath(m_defaultSavePath);
    }
    
    // 获取当前时间戳
    QString timestamp = QDateTime::currentDateTime().toString("yyyyMMdd_HHmmss_zzz");
    
    // 截取GUID的前8位
    QString shortGuid = imageGuid.left(8);
    
    // 生成默认文件名
    QString fileName = QString("image_%1_%2.%3").arg(timestamp).arg(shortGuid).arg(m_defaultSaveFormat);
    
    // 返回完整路径
    return m_defaultSavePath + "/" + fileName;
}

/**
 * @brief 将QImage保存到指定文件路径
 * @param image 要保存的QImage对象
 * @param filePath 目标文件路径
 * @return 保存成功返回true，失败返回false
 */
bool ImageSaver::saveToFile(const QImage &image, const QString &filePath)
{
    if (image.isNull()) {
        setErrorMessage("图像为空，无法保存");
        return false;
    }

    QFileInfo fileInfo(filePath);
    QString format = fileInfo.suffix().toLower();

    // 检查支持的格式
    if (format != "png" && format != "jpg" && format != "jpeg" && format != "bmp" && format != "tif") {
        setErrorMessage("不支持的图像格式：" + format);
        return false;
    }

    QImageWriter writer(filePath, format.toLatin1());
    if (!writer.write(image)) {
        setErrorMessage("保存失败：" + writer.errorString());
        return false;
    }

    clearErrorMessage();
    return true;
}

/**
 * @brief 保存JSON参数到文件
 * @param filePath 目标文件路径
 * @param params 要保存的参数
 * @param axisParams 坐标轴参数
 * @return 保存成功返回true，失败返回false
 */
bool ImageSaver::saveJsonParams(const QString &filePath, const QList<QVariantMap> &params, const AxisParameters &axisParams)
{
    clearErrorMessage();
    
    // 构建顶层JSON对象
    QJsonObject rootObj;
    
    // 构建坐标轴参数子对象
    QJsonObject axisParamsObj;
    axisParamsObj["lengthRatio"] = axisParams.lengthRatio;
    axisParamsObj["timeRatio"] = axisParams.timeRatio;
    axisParamsObj["wavelengthRatio"] = axisParams.wavelengthRatio;
    axisParamsObj["lengthUnit"] = axisParams.lengthUnit;
    axisParamsObj["timeUnit"] = axisParams.timeUnit;
    axisParamsObj["wavelengthUnit"] = axisParams.wavelengthUnit;
    axisParamsObj["xAxisUnit"] = axisParams.xAxisUnit;
    axisParamsObj["yAxisUnit"] = axisParams.yAxisUnit;
    
    // 将坐标轴参数添加到顶层对象
    rootObj["axisParameters"] = axisParamsObj;
    
    // 构建图形处理参数数组
    QJsonArray processingParamsArray;
    
    // 遍历所有处理参数，按处理顺序保存
    for (const QVariantMap& param : params) {
        processingParamsArray.append(QJsonValue::fromVariant(param));
    }
    
    // 将图形处理参数数组添加到顶层对象
    rootObj["processingParameters"] = processingParamsArray;
    
    // 创建JSON文档
    QJsonDocument doc(rootObj);
    
    // 打开文件并写入
    QFile file(filePath);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
        setErrorMessage("无法打开参数文件进行写入: " + filePath);
        qWarning() << errorMessage();
        return false;
    }
    
    if (file.write(doc.toJson()) == -1) {
        setErrorMessage("写入参数文件失败: " + filePath);
        qWarning() << errorMessage();
        file.close();
        return false;
    }
    
    file.close();
    return true;
}

/**
 * @brief 简化的保存接口：直接传入ImageCacheItem进行保存
 * @param baseFilePath 基础文件路径（不包含扩展名）
 * @param cacheItem 要保存的ImageCacheItem对象
 * @return 保存成功返回true，失败返回false
 */
bool ImageSaver::saveImageCacheItem(const QString &baseFilePath, const ImageCacheItem &cacheItem)
{
    clearErrorMessage();
    
    // 创建目录
    QFileInfo fileInfo(baseFilePath + ".png"); // 临时添加扩展名以获取目录路径
    QString dirPath = fileInfo.path();
    if (!createDirectory(dirPath)) {
        return false;
    }
    
    bool allSaved = true;
    
    // 保存原始图像
    if (!cacheItem.originalImage.isNull()) {
        QString originalImagePath = baseFilePath + "_original.png";
        if (!saveToFile(cacheItem.originalImage, originalImagePath)) {
            qWarning() << "无法保存原始图像:" << originalImagePath << errorMessage();
            allSaved = false;
        }
    }
    
    // 保存处理后图像
    if (!cacheItem.processedImage.isNull()) {
        QString processedImagePath = baseFilePath + "_processed.png";
        if (!saveToFile(cacheItem.processedImage, processedImagePath)) {
            qWarning() << "无法保存处理后图像:" << processedImagePath << errorMessage();
            allSaved = false;
        }
    }
    
    // 保存参数文件
    QString paramsPath = baseFilePath + "_params.json";
    if (!saveJsonParams(paramsPath, cacheItem.processingParams, cacheItem.axisParams)) {
        qWarning() << "无法保存参数文件:" << paramsPath << errorMessage();
        allSaved = false;
    }
    
    return allSaved;
}
